home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / svgapc23 / svgadem1.c < prev    next >
C/C++ Source or Header  |  1995-04-30  |  33KB  |  1,446 lines

  1. /****************************************************************************
  2.  
  3.       'SVGACC' A Super Vga Graphics Library for use with Microsoft compatible
  4.       C/C++ compilers
  5.       Copyright 1993-1995 by Stephen L. Balkum and Daniel A. Sill
  6.  
  7.     **************** UNREGISTERD SHAREWARE VERSION ***********************
  8.     * FOR EVUALATION ONLY. NOT FOR RESALE IN ANY FORM. SOFTWARE WRITTEN  *
  9.     * USING THIS UNREGISTERED SHAREWARE GRAPHICS LIBRARY MAY NOT BY SOLD *
  10.     * OR USED FOR ANY PURPOSE OTHER THAN THE EVUALTION OF THIS LIBRARY.  *
  11.     **********************************************************************
  12.  
  13.     **************** NO WARRANTIES AND NO LIABILITY **********************
  14.     * Stephen L. Balkum and Daniel A. Sill provide no warranties, either *
  15.     * expressed or implied, of merchantability, or fitness, for a        *
  16.     * particular use or purpose of this SOFTWARE and documentation.      *
  17.     * In no event shall Stephen L. Balkum or Daniel A. Sill be held      *
  18.     * liable for any damages resulting from the use or misuse of the     *
  19.     * SOFTWARE and documentation.                                        *
  20.     **********************************************************************
  21.  
  22.     ************** U.S. GOVERNMENT RESTRICTED RIGHTS *********************
  23.     * Use, duplication, or disclosure of the SOFTWARE and documentation  *
  24.     * by the U.S. Government is subject to the restictions as set forth  *
  25.     * in subparagraph (c)(1)(ii) of the Rights in Technical Data and     *
  26.     * Computer Software cluse at DFARS 252.227-7013.                     *
  27.     * Contractor/manufacturer is Stephen L. Balkum and Daniel A. Sill,   *
  28.     * P.O. Box 7704, Austin, Texas 78713-7704                            *
  29.     **********************************************************************
  30.  
  31.     **********************************************************************
  32.     * By using this SOFTWARE or documentation, you agree to the above    *
  33.     * terms and conditions.                                              *
  34.     **********************************************************************
  35.  
  36.  ***************************************************************************/
  37.  
  38. #define MODULE
  39.  
  40. #include <stdio.h>
  41. #include <conio.h>
  42. #include <stdlib.h>
  43. #include <malloc.h>
  44. #include <string.h>
  45. #include <math.h>
  46.  
  47. #include "svgacc.h"
  48. #include "svgademo.h"
  49.  
  50. #ifdef __POWERC
  51. #define _frealloc farrealloc
  52. #endif
  53.  
  54. #define randnum(size) (rand() % (int)(size))
  55.  
  56. /***********
  57.  * DOBLOCK *
  58.  ***********/
  59.  
  60. char doblock(void)
  61. {
  62.     int i, colr;
  63.     int xinc, yinc, x1, y1, x2, y2;
  64.     int cntx, cnty;
  65.     char ret;
  66.     char title[TITLEN];
  67.     char buf[TITLEN];
  68.     RasterBlock far *gfxblk;
  69.     RasterBlock far *gfxblk2;
  70.     RasterBlock far *spritebkgnd;
  71.  
  72.     /*
  73.      * Set up the Title
  74.      */
  75.     sprintf(title,"DEMO 5: Block function and Sprites");
  76.     palset(pal,0,255);
  77.  
  78.     /*
  79.      * Show Block Get (draw some circles and "get a chunk of them")
  80.      */
  81.  
  82.     fillscreen(0);
  83.     setview(0,0,maxx,maxy);
  84.     drwstring(SET,7,0,title,10,0);
  85.     sprintf(buf,"blkget(x1,y1,x2,y2,GfxBlock);");
  86.     drwstring(SET,7,0,buf,10,16);
  87.     colr = 16;
  88.     for(i=0;i<=maxx/2;i++) {
  89.         drwcircle(SET,colr,maxx/4+i,maxy/2,maxy/5);
  90.         colr+=2;
  91.         if(colr>255)
  92.             colr = 16;
  93.     }
  94.  
  95.     xinc = maxx/20;
  96.     yinc = maxy/20;
  97.     x1 = maxx/2-xinc;
  98.     y1 = maxy/2-yinc;
  99.     x2 = maxx/2+xinc;
  100.     y2 = maxy/2+yinc;
  101.     i = (x2-x1+1)*(y2-y1+1)+4;
  102.     gfxblk = _fmalloc(i);
  103.     if (!gfxblk) {
  104.         restext();
  105.         printf("ERROR: Allocating memory for gfxblk: %d bytes\n",i);
  106.         exit(1);
  107.     }
  108.     drwbox(SET,0,x1,y1,x2,y2);
  109.     blkget(x1,y1,x2,y2,gfxblk);
  110.  
  111.     ret = demogetkey();
  112.     if ((ret == 's') || (ret == 'q')) {
  113.         fillscreen(0);
  114.         _ffree(gfxblk);
  115.         return(ret);
  116.     }
  117.  
  118.     /*
  119.      * Show Block Rotate and Sprite Stuff
  120.      */
  121.     drwstring(SET,7,0,title,10,0);
  122.     sprintf(buf,"blkrotate(angle,backfill,GfxBlockSrc,GfxBlockDst);");
  123.     drwstring(SET,7,0,buf,10,16);
  124.     sprintf(buf,"spritegap(transcolor,x,y,SpriteArray,BkGndArray);");
  125.     drwstring(SET,7,0,buf,10,32);
  126.     sprintf(buf,"spriteput(transcolor,x,y,SpriteArray);");
  127.     drwstring(SET,7,0,buf,10,48);
  128.     cntx = (x2-x1) / 2 + x1;
  129.     cnty = (y2-y1) / 2 + y1;
  130.     fillarea(x1+2,y1+2,0,0);
  131.     i = blkrotatesize(45,gfxblk);
  132.     spritebkgnd = _fmalloc(i);
  133.     if (!spritebkgnd) {
  134.         restext();
  135.         printf("ERROR: Allocating memory for spritebkgnd: %d bytes\n",i);
  136.         exit(1);
  137.     }
  138.     gfxblk2 = _fmalloc(i);
  139.     if (!gfxblk2) {
  140.         restext();
  141.         printf("ERROR: Allocating memory for gfxblk2: %d bytes\n",i);
  142.         exit(1);
  143.     }
  144.     blkget(x1,y1,x2,y2,spritebkgnd);
  145.     setview(0,64,maxx,maxy);
  146.  
  147.     for(i=0;i<=360;i+=4) {
  148.         blkrotate(i,1,gfxblk,gfxblk2);
  149.         spriteput(SET,1,cntx-(spritebkgnd->width)/2,cnty-(spritebkgnd->height)/2,spritebkgnd);
  150.         spritegap(1,cntx-(gfxblk2->width)/2,cnty-(gfxblk2->height)/2,gfxblk2,spritebkgnd);
  151.         sdelay(4);
  152.     }
  153.     spriteput(SET,1,cntx-(spritebkgnd->width)/2,cnty-(spritebkgnd->height)/2,spritebkgnd);
  154.     blkput(SET,x1,y1,gfxblk);
  155.  
  156.     setview(0,0,maxx,maxy);
  157.     ret = demogetkey();
  158.     if ((ret == 's') || (ret == 'q')) {
  159.         fillscreen(0);
  160.         palset(pal,16,255);
  161.         _ffree(gfxblk);
  162.         _ffree(gfxblk2);
  163.         _ffree(spritebkgnd);
  164.         return(ret);
  165.     }
  166.  
  167.     /*
  168.      * Show Block Resize and Sprite Stuff
  169.      */
  170.     drwstring(SET,7,0,title,10,0);
  171.     sprintf(buf,"blkresize(Width,Height,GfxBlockSrc,GfxBlockDst);");
  172.     drwstring(SET,7,0,buf,10,16);
  173.     sprintf(buf,"spritegap(transcolor,x,y,SpriteArray,BkGndArray);");
  174.     drwstring(SET,7,0,buf,10,32);
  175.     sprintf(buf,"spriteput(transcolor,x,y,SpriteArray);");
  176.     drwstring(SET,7,0,buf,10,48);
  177.     fillarea(x1+2,y1+2,0,0);
  178.     blkget(x1,y1,x2,y2,spritebkgnd);
  179.     setview(0,64,maxx,maxy);
  180.  
  181.     i = (x2-x1+1+xinc)*(y2-y1+1+xinc)+4;
  182.  
  183.     spritebkgnd = _frealloc(spritebkgnd,i);
  184.     if (!spritebkgnd) {
  185.         restext();
  186.         printf("ERROR: reallocating memory for spritebkgnd: %d bytes\n",i);
  187.         exit(1);
  188.     }
  189.  
  190.     gfxblk2 = _frealloc(gfxblk2,i);
  191.     if (!gfxblk2) {
  192.         restext();
  193.         printf("ERROR: reallocating memory for gfxblk2: %d bytes\n",i);
  194.         exit(1);
  195.     }
  196.  
  197.     for(i=0;i<=xinc;i++) {
  198.         blkresize((gfxblk->width)-i,(gfxblk->height)-i,gfxblk,gfxblk2);
  199.         spriteput(SET,1,cntx-(spritebkgnd->width)/2,cnty-(spritebkgnd->height)/2,spritebkgnd);
  200.         spritegap(1,cntx-(gfxblk2->width)/2,cnty-(gfxblk2->height)/2,gfxblk2,spritebkgnd);
  201.         sdelay(3);
  202.     }
  203.     spriteput(SET,1,cntx-(spritebkgnd->width)/2,cnty-(spritebkgnd->height)/2,spritebkgnd);
  204.  
  205.     for(i=xinc;i>=0;i--) {
  206.         blkresize((gfxblk->width)-i,(gfxblk->height)-i,gfxblk,gfxblk2);
  207.         spriteput(SET,1,cntx-(spritebkgnd->width)/2,cnty-(spritebkgnd->height)/2,spritebkgnd);
  208.         spritegap(1,cntx-(gfxblk2->width)/2,cnty-(gfxblk2->height)/2,gfxblk2,spritebkgnd);
  209.         sdelay(3);
  210.     }
  211.     spriteput(SET,1,cntx-(spritebkgnd->width)/2,cnty-(spritebkgnd->height)/2,spritebkgnd);
  212.     blkput(SET,x1,y1,gfxblk);
  213.  
  214.     ret = demogetkey();
  215.     if ((ret == 's') || (ret == 'q')) {
  216.         fillscreen(0);
  217.         palset(pal,16,255);
  218.         setview(0,0,maxx,maxy);
  219.         _ffree(gfxblk);
  220.         _ffree(gfxblk2);
  221.         _ffree(spritebkgnd);
  222.         return(ret);
  223.     }
  224.  
  225.  
  226.     /*
  227.      * Show Block Put (put the "chunks" randomly around the screen)
  228.      */
  229.     setview(0,16,maxx,32);
  230.     fillview(0);
  231.     sprintf(buf,"blkput(mode,x,y,GfxBlock);");
  232.     drwstring(SET,7,0,buf,10,16);
  233.     xinc = maxx/10;
  234.     yinc = maxy/10;
  235.     setview(0,32,maxx,maxy);
  236.     for(i=0;i<=maxx/2;i++) {
  237.         x1 = randnum(maxx + xinc) - xinc;
  238.         y1 = randnum(maxy + yinc) - yinc;
  239.         blkput(SET,x1,y1,gfxblk);
  240.     }
  241.  
  242.     _ffree(gfxblk);
  243.     _ffree(gfxblk2);
  244.     _ffree(spritebkgnd);
  245.     setview(0,0,maxx,maxy);
  246.     ret = demogetkey();
  247.     if ((ret == 's') || (ret == 'q')) {
  248.         fillscreen(0);
  249.         return(ret);
  250.     }
  251.  
  252.     return(ret);
  253.  
  254. }
  255.  
  256.  
  257.  
  258. /**********
  259.  * DOCLIP *
  260.  **********/
  261.  
  262. char doclip(void)
  263. {
  264.     struct dcoord {
  265.         int x1;
  266.         int x2;
  267.         int y1;
  268.         int y2;
  269.     };
  270.  
  271.     int i, j, k;
  272.     int xinc, x, y, x1, y1, x2, y2;
  273.     int xsub, radx, rady;
  274.     int wdth, hgth, spcingx, spcingy;
  275.     struct dcoord b[4];
  276.     char ret;
  277.     char title[TITLEN];
  278.     char buf[TITLEN];
  279.  
  280.     /*
  281.      * Set up the Title
  282.      */
  283.     sprintf(title,"DEMO 2: Clipping capability");
  284.     palset(pal,0,255);
  285.  
  286.     /*
  287.      * Set up the windows
  288.      */
  289.  
  290.     fillscreen(0);
  291.     setview(0,0,maxx,maxy);
  292.     drwstring(SET,7,0,title,10,0);
  293.     sprintf(buf,"All pimitives automatically clip");
  294.     drwstring(SET,7,0,buf,10,16);
  295.  
  296.     wdth = (maxx + 1) * 4 / 9;
  297.     spcingx = ((maxx + 1) - wdth * 2) / 3;
  298.     hgth = (maxy + 1 - 35) * 4 / 9;
  299.     spcingy = ((maxy + 1 - 35) - hgth * 2) / 3;
  300.     xinc = wdth * 3 / 2;
  301.     xsub = wdth / 4;
  302.  
  303.     b[0].x1 = spcingx;
  304.     b[0].x2 = b[0].x1 + wdth;
  305.     b[0].y1 = spcingy + 35;
  306.     b[0].y2 = b[0].y1 + hgth;
  307.  
  308.     b[1].x2 = maxx - spcingx;
  309.     b[1].x1 = b[1].x2 - wdth;
  310.     b[1].y1 = spcingy + 35;
  311.     b[1].y2 = b[1].y1 + hgth;
  312.  
  313.     b[2].x2 = maxx - spcingx;
  314.     b[2].x1 = b[2].x2 - wdth;
  315.     b[2].y2 = maxy - spcingy;
  316.     b[2].y1 = b[2].y2 - hgth;
  317.  
  318.     b[3].x1 = spcingx;
  319.     b[3].x2 = b[3].x1 + wdth;
  320.     b[3].y2 = maxy - spcingy;
  321.     b[3].y1 = b[3].y2 - hgth;
  322.  
  323.     for(i=0;i<4;i++)
  324.         drwbox(SET,15,b[i].x1++,b[i].y1++,b[i].x2--,b[i].y2--);
  325.  
  326.     /*
  327.      * Show the clipping
  328.      */
  329.     for(i=0;i<=maxx/6;i++)
  330.         for(j=0;j<4;j++) {
  331.             setview(b[j].x1,b[j].y1,b[j].x2,b[j].y2);
  332.             switch (j) {
  333.                 case 0:
  334.                     for(k=0;k<6;k++) {
  335.                         x = b[j].x1 + randnum(xinc) - xsub;
  336.                         y = b[j].y1 + randnum(xinc) - xsub;
  337.                         drwpoint(SET,randnum(16),x,y);
  338.                     }
  339.                     break;
  340.                 case 1:
  341.                     x1 = b[j].x1 + randnum(xinc) - xsub;
  342.                     y1 = b[j].y1 + randnum(xinc) - xsub;
  343.                     x2 = b[j].x1 + randnum(xinc) - xsub;
  344.                     y2 = b[j].y1 + randnum(xinc) - xsub;
  345.                     drwline(SET,randnum(16),x1,y1,x2,y2);
  346.                     break;
  347.                 case 2:
  348.                     x = b[j].x1 + randnum(xinc) - xsub;
  349.                     y = b[j].y1 + randnum(xinc) - xsub;
  350.                     radx = randnum(wdth) / 2;
  351.                     drwcircle(SET,randnum(16),x,y,radx);
  352.                     break;
  353.                 case 3:
  354.                     x = b[j].x1 + randnum(xinc) - xsub;
  355.                     y = b[j].y1 + randnum(xinc) - xsub;
  356.                     radx = randnum(wdth) / 2;
  357.                     rady = randnum(wdth) / 2;
  358.                     drwellipse(SET,randnum(16),x,y,radx,rady);
  359.                     break;
  360.             }
  361.         }
  362.  
  363.     setview(0,0,maxx,maxy);
  364.  
  365.     ret = demogetkey();
  366.  
  367.     return(ret);
  368.  
  369. }
  370.  
  371. /**********
  372.  * DOFILL *
  373.  **********/
  374.  
  375. char dofill(void)
  376. {
  377.     struct dcoord {
  378.         int x1;
  379.         int x2;
  380.         int y1;
  381.         int y2;
  382.     };
  383.  
  384.     int i, colr;
  385.     int x, y;
  386.     int radx, rady;
  387.     int wdth, hgth, spcingx, spcingy;
  388.     struct dcoord b[4];
  389.     char ret;
  390.     char title[TITLEN];
  391.     char buf[TITLEN];
  392.  
  393.     /*
  394.      * Set up the Title
  395.      */
  396.     sprintf(title,"DEMO 3: Filling functions");
  397.     palset(pal,0,255);
  398.  
  399.     /*
  400.      * Set up the windows
  401.      */
  402.  
  403.     fillscreen(10);
  404.     setview(0,0,maxx,maxy);
  405.     drwstring(SET,7,0,title,10,0);
  406.     sprintf(buf,"fillscreen(color);");
  407.     drwstring(SET,7,0,buf,10,16);
  408.  
  409.     ret = demogetkey();
  410.     if ((ret == 's') || (ret == 'q'))
  411.         return(ret);
  412.  
  413.     /*
  414.      * Set up windows and show viewport fill
  415.      */
  416.     fillscreen(0);
  417.     drwstring(SET,7,0,title,10,0);
  418.     sprintf(buf,"fillview(color);");
  419.     drwstring(SET,7,0,buf,10,16);
  420.  
  421.     wdth = (maxx + 1) * 4 / 9;
  422.     spcingx = ((maxx + 1) - wdth * 2) / 3;
  423.     hgth = (maxy + 1 - 35) * 4 / 9;
  424.     spcingy = ((maxy + 1 - 35) - hgth * 2) / 3;
  425.  
  426.     b[0].x1 = spcingx;
  427.     b[0].x2 = b[0].x1 + wdth;
  428.     b[0].y1 = spcingy + 35;
  429.     b[0].y2 = b[0].y1 + hgth;
  430.  
  431.     b[1].x2 = maxx - spcingx;
  432.     b[1].x1 = b[1].x2 - wdth;
  433.     b[1].y1 = spcingy + 35;
  434.     b[1].y2 = b[1].y1 + hgth;
  435.  
  436.     b[2].x2 = maxx - spcingx;
  437.     b[2].x1 = b[2].x2 - wdth;
  438.     b[2].y2 = maxy - spcingy;
  439.     b[2].y1 = b[2].y2 - hgth;
  440.  
  441.     b[3].x1 = spcingx;
  442.     b[3].x2 = b[3].x1 + wdth;
  443.     b[3].y2 = maxy - spcingy;
  444.     b[3].y1 = b[3].y2 - hgth;
  445.  
  446.     for(i=0;i<4;i++)
  447.         drwbox(SET,15,b[i].x1++,b[i].y1++,b[i].x2--,b[i].y2--);
  448.  
  449.     ret = demogetkey();
  450.     if ((ret == 's') || (ret == 'q')) {
  451.         setview(0,0,maxx,maxy);
  452.         return(ret);
  453.     }
  454.  
  455.     /*
  456.      * Show the clipping
  457.      */
  458.     for(i=0;i<4;i++) {
  459.         setview(b[i].x1,b[i].y1,b[i].x2,b[i].y2);
  460.         fillview(i+10);
  461.     }
  462.  
  463.     setview(0,0,maxx,maxy);
  464.     ret = demogetkey();
  465.     if ((ret == 's') || (ret == 'q'))
  466.         return(ret);
  467.  
  468.     /*
  469.      * Set up windows and show area fill
  470.      */
  471.     fillscreen(0);
  472.     drwstring(SET,7,0,title,10,0);
  473.     sprintf(buf,"fillarea(xseed,yseed,bordercolor,fillcolor);");
  474.     drwstring(SET,7,0,buf,10,16);
  475.  
  476.     drwbox(SET,15,5,35,maxx-4,maxy-4);
  477.     setview(6,36,maxx-5,maxy-5);
  478.  
  479.     colr=1;
  480.     for(i=0;i<=maxx/10;i++) {
  481.         x = 50 + randnum(maxx-50);
  482.         y = 50 + randnum(maxy-50);
  483.         radx = 2 + randnum(maxx/20);
  484.         rady = 2 + randnum(maxy/20);
  485.         drwellipse(SET,colr++,x,y,radx,rady);
  486.         if (colr>9)
  487.             colr = 1;
  488.     }
  489.  
  490.     for(i=0;i<=maxx/15;i++) {
  491.         x = 50 + randnum(maxx-50);
  492.         y = 50 + randnum(maxy-50);
  493.         radx = 2 + randnum(maxx/20);
  494.         rady = 2 + randnum(maxy/20);
  495.         drwellipse(SET,12,x,y,radx,rady);
  496.     }
  497.  
  498.     ret = demogetkey();
  499.     if ((ret == 's') || (ret == 'q')) {
  500.         setview(0,0,maxx,maxy);
  501.         return(ret);
  502.     }
  503.  
  504.     fillarea(7,37,12,10);
  505.  
  506.     setview(0,0,maxx,maxy);
  507.     ret = demogetkey();
  508.     if ((ret == 's') || (ret == 'q'))
  509.         return(ret);
  510.  
  511.     /*
  512.      * Setup windows and show color fill
  513.      */
  514.     fillscreen(0);
  515.     drwstring(SET,7,0,title,10,0);
  516.     sprintf(buf,"fillcolor(xseed,yseed,oldcolor,fillcolor);");
  517.     drwstring(SET,7,0,buf,10,16);
  518.  
  519.     drwbox(SET,15,5,35,maxx-4,maxy-4);
  520.     setview(6,36,maxx-5,maxy-5);
  521.  
  522.     colr=1;
  523.     for(i=0;i<=maxx/10;i++) {
  524.         x = 50 + randnum(maxx-50);
  525.         y = 50 + randnum(maxy-50);
  526.         radx = 2 + randnum(maxx/20);
  527.         rady = 2 + randnum(maxy/20);
  528.         drwellipse(SET,colr++,x,y,radx,rady);
  529.         if (colr>9)
  530.             colr = 1;
  531.     }
  532.  
  533.     for(i=0;i<=maxx/15;i++) {
  534.         x = 50 + randnum(maxx-50);
  535.         y = 50 + randnum(maxy-50);
  536.         radx = 2 + randnum(maxx/20);
  537.         rady = 2 + randnum(maxy/20);
  538.         drwellipse(SET,12,x,y,radx,rady);
  539.     }
  540.  
  541.     ret = demogetkey();
  542.     if ((ret == 's') || (ret == 'q')) {
  543.         setview(0,0,maxx,maxy);
  544.         return(ret);
  545.     }
  546.  
  547.     fillcolor(7,37,0,10);
  548.  
  549.     setview(0,0,maxx,maxy);
  550.  
  551.     ret = demogetkey();
  552.  
  553.     return(ret);
  554.  
  555. }
  556.  
  557.  
  558. /*********
  559.  * DOPAL *
  560.  *********/
  561.  
  562. char dopal(void)
  563. {
  564.     int x1, x2, y1, y2;
  565.     int i, colr;
  566.     char ret;
  567.     char title[TITLEN];
  568.     char buf[TITLEN];
  569.  
  570.     /*
  571.      * Set up the Title
  572.      */
  573.     sprintf(title,"DEMO 4: Palette functions");
  574.     palset(orgpal,0,255);
  575.  
  576.     /*
  577.      * Show palette set/get
  578.      */
  579.  
  580.     fillscreen(0);
  581.     setview(0,0,maxx,maxy);
  582.     drwstring(SET,7,0,title,10,0);
  583.     sprintf(buf,"palget(pal,beg,end),palset(pal,beg,end)");
  584.     drwstring(SET,7,0,buf,10,16);
  585.  
  586.     colr = 16;
  587.     x1 = 10;
  588.     x2 = maxx - 9;
  589.     y1 = 35;
  590.     y2 = maxy - 9;
  591.     i = 0;
  592.     while (y1+i < y2-i) {
  593.         drwbox(SET,colr++,x1+i,y1+i,x2-i,y2-i);
  594.         if (colr>255)
  595.             colr = 16;
  596.         i++;
  597.     }
  598.     ret = demogetkey();
  599.     if ((ret == 's') || (ret == 'q')) {
  600.         fillscreen(0);
  601.         setview(0,0,maxx,maxy);
  602.         return(ret);
  603.     }
  604.     palset(pal,16,255);
  605.     ret = demogetkey();
  606.     if ((ret == 's') || (ret == 'q')) {
  607.         setview(0,0,maxx,maxy);
  608.         fillscreen(0);
  609.         return(ret);
  610.     }
  611.  
  612.     /*
  613.      * Show palette auto fade out/in
  614.      */
  615.     setview(0,16,maxx,32);
  616.     fillview(0);
  617.     sprintf(buf,"palioauto(pal,beg,end,speed);");
  618.     drwstring(SET,7,0,buf,10,16);
  619.     palioauto(pal,16,255,-2);
  620.     palioauto(pal,16,255,2);
  621.     ret = demogetkey();
  622.     if ((ret == 's') || (ret == 'q')) {
  623.         setview(0,0,maxx,maxy);
  624.         return(ret);
  625.     }
  626.  
  627.     /*
  628.      * Show palette auto fade to
  629.      */
  630.     setview(0,16,maxx,32);
  631.     fillview(0);
  632.     sprintf(buf,"palchgauto(pal,newpal,beg,end,speed);");
  633.     drwstring(SET,7,0,buf,10,16);
  634.     palchgauto(pal,pal2,16,255,2);
  635.     palchgauto(pal2,pal,16,255,2);
  636.     ret = demogetkey();
  637.     if ((ret == 's') || (ret == 'q')) {
  638.         setview(0,0,maxx,maxy);
  639.         return(ret);
  640.     }
  641.  
  642.     /*
  643.      * Show palette rotate
  644.      */
  645.     setview(0,16,maxx,32);
  646.     fillview(0);
  647.     sprintf(buf,"palrotate(pal,beg,end,shift);");
  648.     drwstring(SET,7,0,buf,10,16);
  649.     for(i=0;i<=240;i++) {
  650.         palrotate(pal,16,255,2);
  651.         palget(pal,16,255);
  652.     }
  653.     for(i=0;i<=120;i++) {
  654.         palrotate(pal,16,255,-8);
  655.         palget(pal,16,255);
  656.     }
  657.     ret = demogetkey();
  658.     if ((ret == 's') || (ret == 'q'))
  659.         setview(0,0,maxx,maxy);
  660.  
  661.     return(ret);
  662.  
  663. }
  664.  
  665.  
  666. /***********
  667.  * DOPRIMS *
  668.  ***********/
  669.  
  670. char doprims(void)
  671. {
  672.  
  673.     int x1, x2, y1, y2;
  674.     int maxrad, radx, rady;
  675.     int i, colr, num, sang, eang;
  676.     int ofst, intsbits, numlevels;
  677.     D2Point p1, off1, off2, p2;
  678.  
  679.     char ret;
  680.     char title[TITLEN];
  681.     char buf[TITLEN];
  682.     PaletteData pal;
  683.  
  684.     /*
  685.      * Set up the Title
  686.      */
  687.     sprintf(title,"DEMO 1: Primitives");
  688.     palset(orgpal,0,255);
  689.  
  690.     /*
  691.      * Draw some points
  692.      */
  693.  
  694.     fillscreen(0);
  695.     setview(0,0,maxx,maxy);
  696.     drwstring(SET,7,0,title,10,0);
  697.     sprintf(buf,"drwpoint(mode,color,x,y);");
  698.     drwstring(SET,7,0,buf,10,16);
  699.     setview(0,32,maxx,maxy);
  700.     colr = 1;
  701.     num = maxx * 2;
  702.     for(i=0;i<num;i++) {
  703.         x1 = randnum(maxx);
  704.         y1 = randnum(maxy);
  705.         drwpoint(SET,colr++,x1,y1);
  706.         if (colr>15)
  707.             colr = 1;
  708.     }
  709.     setview(0,0,maxx,maxy);
  710.     ret = demogetkey();
  711.     if ((ret=='s') || (ret=='q'))
  712.         return(ret);
  713.  
  714.     /*
  715.      * Draw some lines
  716.      */
  717.     fillscreen(0);
  718.     setview(0,0,maxx,maxy);
  719.     drwstring(SET,7,0,title,10,0);
  720.     sprintf(buf,"drwline(mode,color,x1,y1,x2,y2);");
  721.     drwstring(SET,7,0,buf,10,16);
  722.     setview(0,32,maxx,maxy);
  723.     colr = 1;
  724.     num = maxx / 6;
  725.  
  726.     for(i=0;i<num;i++) {
  727.         x1 = randnum(maxx);
  728.         y1 = randnum(maxy);
  729.         x2 = randnum(maxx);
  730.         y2 = randnum(maxy);
  731.         drwline(SET,colr++,x1,y1,x2,y2);
  732.         if (colr>15)
  733.             colr = 1;
  734.     }
  735.     setview(0,0,maxx,maxy);
  736.     ret = demogetkey();
  737.     if ((ret=='s') || (ret=='q'))
  738.         return(ret);
  739.  
  740.     /*
  741.      * Draw some antialiased lines
  742.      */
  743.     fillscreen(0);
  744.     setview(0,0,maxx,maxy);
  745.     drwstring(SET,7,0,title,10,0);
  746.     sprintf(buf,"drwaline(colorbits,color,x1,y1,x2,y2);  [antialised lines]");
  747.     drwstring(SET,7,0,buf,10,16);
  748.     setview(0,32,maxx,maxy);
  749.     num = maxx / 8;
  750.     intsbits = 3; /* provide 2^3=8 shades */
  751.     numlevels = 1 << intsbits;
  752.     palget(pal,0,255);
  753.     for (i=0;i<numlevels;i++) {
  754.  
  755.         /* do not shade completely to zero:  colors range from 63 - 28 */
  756.  
  757.         /* blue */
  758.         ofst = 128 + numlevels * 0 + i;
  759.         pal[ofst].r = 0;
  760.         pal[ofst].g = 0;
  761.         pal[ofst].b = (char)(63-35*i/(numlevels-1));
  762.  
  763.         /* green */
  764.         ofst = 128 + numlevels * 1 + i;
  765.         pal[ofst].r = 0;
  766.         pal[ofst].g = (char)(63-35*i/(numlevels-1));
  767.         pal[ofst].b = 0;
  768.  
  769.         /* cyan */
  770.         ofst = 128 + numlevels * 2 + i;
  771.         pal[ofst].r = 0;
  772.         pal[ofst].g = (char)(63-35*i/(numlevels-1));
  773.         pal[ofst].b = (char)(63-35*i/(numlevels-1));
  774.  
  775.         /* red */
  776.         ofst = 128 + numlevels * 3 + i;
  777.         pal[ofst].r = (char)(63-35*i/(numlevels-1));
  778.         pal[ofst].g = 0;
  779.         pal[ofst].b = 0;
  780.  
  781.         /* magenta */
  782.         ofst = 128 + numlevels * 4 + i;
  783.         pal[ofst].r = (char)(63-35*i/(numlevels-1));
  784.         pal[ofst].g = 0;
  785.         pal[ofst].b = (char)(63-35*i/(numlevels-1));
  786.  
  787.         /* yellow */
  788.         ofst = 128 + numlevels * 5 + i;
  789.         pal[ofst].r = (char)(63-35*i/(numlevels-1));
  790.         pal[ofst].g = (char)(63-35*i/(numlevels-1));
  791.         pal[ofst].b = 0;
  792.  
  793.         /* white */
  794.         ofst = 128 + numlevels * 6 + i;
  795.         pal[ofst].r = (char)(63-35*i/(numlevels-1));
  796.         pal[ofst].g = (char)(63-35*i/(numlevels-1));
  797.         pal[ofst].b = (char)(63-35*i/(numlevels-1));
  798.  
  799.     }
  800.     palset(pal,0,255);
  801.     colr = 0;
  802.     for(i=0;i<num;i++) {
  803.         x1 = randnum(maxx);
  804.         y1 = randnum(maxy);
  805.         x2 = randnum(maxx);
  806.         y2 = randnum(maxy);
  807.         drwaline(intsbits,128+colr*numlevels,x1,y1,x2,y2);
  808.         colr++;
  809.         if (colr>6)
  810.             colr = 0;
  811.     }
  812.     setview(0,0,maxx,maxy);
  813.     ret = demogetkey();
  814.     palset(orgpal,0,255);
  815.     if ((ret=='s') || (ret=='q'))
  816.         return(ret);
  817.  
  818.  
  819.     /*
  820.      * Draw some boxes
  821.      */
  822.     fillscreen(0);
  823.     setview(0,0,maxx,maxy);
  824.     drwstring(SET,7,0,title,10,0);
  825.     sprintf(buf,"drwbox(mode,color,x1,y1,x2,y2);");
  826.     drwstring(SET,7,0,buf,10,16);
  827.     setview(0,32,maxx,maxy);
  828.     colr = 1;
  829.     num = maxx / 10;
  830.     for(i=0;i<num;i++) {
  831.         x1 = randnum(maxx);
  832.         y1 = randnum(maxy);
  833.         x2 = randnum(maxx);
  834.         y2 = randnum(maxy);
  835.         drwbox(SET,colr++,x1,y1,x2,y2);
  836.         if (colr>15)
  837.             colr = 1;
  838.     }
  839.     setview(0,0,maxx,maxy);
  840.     ret = demogetkey();
  841.     if ((ret=='s') || (ret=='q'))
  842.         return(ret);
  843.  
  844.     /*
  845.      * Draw some filled boxes
  846.      */
  847.     fillscreen(0);
  848.     setview(0,0,maxx,maxy);
  849.     drwstring(SET,7,0,title,10,0);
  850.     sprintf(buf,"drwfillbox(mode,color,x1,y1,x2,y2);");
  851.     drwstring(SET,7,0,buf,10,16);
  852.     setview(0,32,maxx,maxy);
  853.     colr = 1;
  854.     num = maxx / 15;
  855.     for(i=0;i<num;i++) {
  856.         x1 = randnum(maxx);
  857.         y1 = randnum(maxy);
  858.         x2 = randnum(maxx);
  859.         y2 = randnum(maxy);
  860.         drwfillbox(SET,colr++,x1,y1,x2,y2);
  861.         if (colr>15)
  862.             colr = 1;
  863.     }
  864.     setview(0,0,maxx,maxy);
  865.     ret = demogetkey();
  866.     if ((ret=='s') || (ret=='q'))
  867.         return(ret);
  868.  
  869.     /*
  870.      * Draw some circles
  871.      */
  872.     fillscreen(0);
  873.     setview(0,0,maxx,maxy);
  874.     drwstring(SET,7,0,title,10,0);
  875.     sprintf(buf,"drwcircle(mode,color,cx,cy,radius);");
  876.     drwstring(SET,7,0,buf,10,16);
  877.     setview(0,32,maxx,maxy);
  878.     colr = 1;
  879.     num = maxx / 20;
  880.     maxrad = maxx / 2;
  881.     for(i=0;i<num;i++) {
  882.         x1 = randnum(maxx);
  883.         y1 = randnum(maxy);
  884.         radx = randnum(maxrad);
  885.         drwcircle(SET,colr++,x1,y1,radx);
  886.         if (colr>15)
  887.             colr = 1;
  888.     }
  889.     setview(0,0,maxx,maxy);
  890.     ret = demogetkey();
  891.     if ((ret=='s') || (ret=='q'))
  892.         return(ret);
  893.  
  894.     /*
  895.      * Draw some filled circles
  896.      */
  897.     fillscreen(0);
  898.     setview(0,0,maxx,maxy);
  899.     drwstring(SET,7,0,title,10,0);
  900.     sprintf(buf,"drwfillcircle(mode,color,cx,cy,radius);");
  901.     drwstring(SET,7,0,buf,10,16);
  902.     setview(0,32,maxx,maxy);
  903.     colr = 1;
  904.     num = maxx / 25;
  905.     maxrad = maxx / 2;
  906.     for(i=0;i<num;i++) {
  907.         x1 = randnum(maxx);
  908.         y1 = randnum(maxy);
  909.         radx = randnum(maxrad);
  910.         drwfillcircle(SET,colr++,x1,y1,radx);
  911.         if (colr>15)
  912.             colr = 1;
  913.     }
  914.     setview(0,0,maxx,maxy);
  915.     ret = demogetkey();
  916.     if ((ret=='s') || (ret=='q'))
  917.         return(ret);
  918.  
  919.     /*
  920.      * Draw some ellipses
  921.      */
  922.     fillscreen(0);
  923.     setview(0,0,maxx,maxy);
  924.     drwstring(SET,7,0,title,10,0);
  925.     sprintf(buf,"drwellipse(mode,color,cx,cy,radiusx,radiusy);");
  926.     drwstring(SET,7,0,buf,10,16);
  927.     setview(0,32,maxx,maxy);
  928.     colr = 1;
  929.     num = maxx / 20;
  930.     maxrad = maxx / 2;
  931.     for(i=0;i<num;i++) {
  932.         x1 = randnum(maxx);
  933.         y1 = randnum(maxy);
  934.         radx = randnum(maxrad);
  935.         rady = randnum(maxrad);
  936.         drwellipse(SET,colr++,x1,y1,radx,rady);
  937.         if (colr>15)
  938.             colr = 1;
  939.     }
  940.     setview(0,0,maxx,maxy);
  941.     ret = demogetkey();
  942.  
  943.  
  944.     /*
  945.      * Draw some filled ellipses
  946.      */
  947.     fillscreen(0);
  948.     setview(0,0,maxx,maxy);
  949.     drwstring(SET,7,0,title,10,0);
  950.     sprintf(buf,"drwfillellipse(mode,color,cx,cy,radiusx,radiusy);");
  951.     drwstring(SET,7,0,buf,10,16);
  952.     setview(0,32,maxx,maxy);
  953.     colr = 1;
  954.     num = maxx / 25;
  955.     maxrad = maxx / 2;
  956.     for(i=0;i<num;i++) {
  957.         x1 = randnum(maxx);
  958.         y1 = randnum(maxy);
  959.         radx = randnum(maxrad);
  960.         rady = randnum(maxrad);
  961.         drwfillellipse(SET,colr++,x1,y1,radx,rady);
  962.         if (colr>15)
  963.             colr = 1;
  964.     }
  965.     setview(0,0,maxx,maxy);
  966.     ret = demogetkey();
  967.     if ((ret=='s') || (ret=='q'))
  968.         return(ret);
  969.  
  970.  
  971.     /*
  972.      * Draw some circular arcs
  973.      */
  974.     fillscreen(0);
  975.     setview(0,0,maxx,maxy);
  976.     drwstring(SET,7,0,title,10,0);
  977.     sprintf(buf,"drwcirarc(mode,color,cx,cy,radius,startang,endang);");
  978.     drwstring(SET,7,0,buf,10,16);
  979.     setview(0,32,maxx,maxy);
  980.     colr = 1;
  981.     num = maxx / 20;
  982.     maxrad = maxx / 2;
  983.     for(i=0;i<num;i++) {
  984.         x1 = randnum(maxx);
  985.         y1 = randnum(maxy);
  986.         radx = randnum(maxrad);
  987.         sang = randnum(360);
  988.         eang = randnum(360) + sang;
  989.         drwcirarc(SET,colr++,x1,y1,radx,sang,eang);
  990.         if (colr>15)
  991.             colr = 1;
  992.     }
  993.     setview(0,0,maxx,maxy);
  994.     ret = demogetkey();
  995.     if ((ret=='s') || (ret=='q'))
  996.         return(ret);
  997.  
  998.  
  999.     /*
  1000.      * Draw some elliptical arcs
  1001.      */
  1002.     fillscreen(0);
  1003.     setview(0,0,maxx,maxy);
  1004.     drwstring(SET,7,0,title,10,0);
  1005.     sprintf(buf,"drwellarc(mode,color,cx,cy,radiusx,radiusy,startang,endang);");
  1006.     drwstring(SET,7,0,buf,10,16);
  1007.     setview(0,32,maxx,maxy);
  1008.     colr = 1;
  1009.     num = maxx / 20;
  1010.     maxrad = maxx / 2;
  1011.     for(i=0;i<num;i++) {
  1012.         x1 = randnum(maxx);
  1013.         y1 = randnum(maxy);
  1014.         radx = randnum(maxrad);
  1015.         rady = randnum(maxrad);
  1016.         sang = randnum(360);
  1017.         eang = randnum(360) + sang;
  1018.         drwellarc(SET,colr++,x1,y1,radx,rady,sang,eang);
  1019.         if (colr>15)
  1020.             colr = 1;
  1021.     }
  1022.     setview(0,0,maxx,maxy);
  1023.     ret = demogetkey();
  1024.     if ((ret=='s') || (ret=='q'))
  1025.         return(ret);
  1026.  
  1027.  
  1028.     /*
  1029.      * Draw some cubic bezier curves
  1030.      */
  1031.     fillscreen(0);
  1032.     setview(0,0,maxx,maxy);
  1033.     drwstring(SET,7,0,title,10,0);
  1034.     sprintf(buf,"drwcubicbezier(mode,color,pon1,poff1,poff2,pon2);");
  1035.     drwstring(SET,7,0,buf,10,16);
  1036.     setview(0,32,maxx,maxy);
  1037.     colr = 1;
  1038.     num = maxx / 20;
  1039.     for(i=0;i<num;i++) {
  1040.         p1.x = randnum(maxx);
  1041.         p1.y = randnum(maxy);
  1042.         off1.x = randnum(maxx);
  1043.         off1.y = randnum(maxy);
  1044.         off2.x = randnum(maxx);
  1045.         off2.y = randnum(maxy);
  1046.         p2.x = randnum(maxx);
  1047.         p2.y = randnum(maxy);
  1048.         drwcubicbezier(SET,colr++,&p1,&off1,&off2,&p2);
  1049.         if (colr>15)
  1050.             colr = 1;
  1051.     }
  1052.     setview(0,0,maxx,maxy);
  1053.     ret = demogetkey();
  1054.     return(ret);
  1055.  
  1056. }
  1057.  
  1058.  
  1059. /************
  1060.  * DOSCROLL *
  1061.  ************/
  1062.  
  1063. char doscroll(void)
  1064. {
  1065.     int i, j, colr, num, totnum;
  1066.     int a, b, c, d;
  1067.     int x1, x2, y1, y2;
  1068.     int spcing, skip;
  1069.     long numbanks, numpages, banksperpage;
  1070.     char ret;
  1071.     char title[TITLEN];
  1072.     char buf[TITLEN];
  1073.     char buf2[TITLEN];
  1074.  
  1075.     /*
  1076.      * Set up the Title
  1077.      */
  1078.     sprintf(title,"DEMO 7: Scroll functions");
  1079.     palset(pal,0,255);
  1080.     fillscreen(0);
  1081.     setview(0,0,maxx,maxy);
  1082.     drwstring(SET,7,0,title,10,0);
  1083.  
  1084.     spcing = (maxy - 32) / 5;
  1085.     x1 = (maxx + 1) / 2 - spcing;
  1086.     y1 = (maxy + 1 - 32) / 2 + 32 - spcing;
  1087.     x2 = (maxx + 1) / 2 + spcing;
  1088.     y2 = (maxy + 1 - 32) / 2 + 32 + spcing;
  1089.     skip = spcing / 15;
  1090.     num = spcing / skip;
  1091.     if (spcing / 2 != (float)spcing / 2.)
  1092.         spcing++;
  1093.  
  1094.  
  1095.     drwbox(SET,12,x1++,y1++,x2--,y2--);
  1096.     colr = 16;
  1097.     sprintf(buf2,"TEXT text TEXT");
  1098.  
  1099.     /*
  1100.      * Show scrollup
  1101.      */
  1102.     setview(0,16,maxx,maxy);
  1103.     sprintf(buf,"scrollup(x1,y1,x2,y2,numlines,fillcolor);");
  1104.     drwstring(SET,7,0,buf,10,16);
  1105.     setview(x1,y1,x2,y2);
  1106.     fillview(0);
  1107.     totnum = maxx / 10;
  1108.     for(i=0;i<totnum;i++) {
  1109.         a = randnum(maxx);
  1110.         b = randnum(maxy);
  1111.         c = randnum(maxx);
  1112.         d = randnum(maxy);
  1113.         drwline(SET,colr,a,b,c,d);
  1114.         colr += 3;
  1115.         if (colr > 255)
  1116.             colr = 16;
  1117.     }
  1118.     drwstring(SET,7,0,buf2,x1+spcing,y1+spcing);
  1119.     drwstringlt(SET,7,0,buf2,x1+spcing,y1+spcing);
  1120.     drwstringrt(SET,7,0,buf2,x1+spcing,y1+spcing);
  1121.     drwstringdn(SET,7,0,buf2,x1+spcing,y1+spcing);
  1122.  
  1123.     for(i=0;i<num;i++)
  1124.         scrollup(x1,y1,x2,y2,skip,0);
  1125.  
  1126.     ret = demogetkey();
  1127.     if ((ret=='s') || (ret=='q'))
  1128.         return(ret);
  1129.  
  1130.     /*
  1131.      * Show scrolllt
  1132.      */
  1133.     setview(0,16,maxx,maxy);
  1134.     sprintf(buf,"scrolllt(x1,y1,x2,y2,numlines,fillcolor);");
  1135.     drwstring(SET,7,0,buf,10,16);
  1136.     setview(x1,y1,x2,y2);
  1137.     fillview(0);
  1138.     totnum = maxx / 10;
  1139.     for(i=0;i<totnum;i++) {
  1140.         a = randnum(maxx);
  1141.         b = randnum(maxy);
  1142.         c = randnum(maxx);
  1143.         d = randnum(maxy);
  1144.         drwline(SET,colr,a,b,c,d);
  1145.         colr += 3;
  1146.         if (colr > 255)
  1147.             colr = 16;
  1148.     }
  1149.     drwstring(SET,7,0,buf2,x1+spcing,y1+spcing);
  1150.     drwstringlt(SET,7,0,buf2,x1+spcing,y1+spcing);
  1151.     drwstringrt(SET,7,0,buf2,x1+spcing,y1+spcing);
  1152.     drwstringdn(SET,7,0,buf2,x1+spcing,y1+spcing);
  1153.  
  1154.     for(i=0;i<num;i++)
  1155.         scrolllt(x1,y1,x2,y2,skip,0);
  1156.  
  1157.     ret = demogetkey();
  1158.     if ((ret=='s') || (ret=='q'))
  1159.         return(ret);
  1160.  
  1161.     /*
  1162.      * Show scrolldn
  1163.      */
  1164.     setview(0,16,maxx,maxy);
  1165.     sprintf(buf,"scrolldn(x1,y1,x2,y2,numlines,fillcolor);");
  1166.     drwstring(SET,7,0,buf,10,16);
  1167.     setview(x1,y1,x2,y2);
  1168.     fillview(0);
  1169.     totnum = maxx / 10;
  1170.     for(i=0;i<totnum;i++) {
  1171.         a = randnum(maxx);
  1172.         b = randnum(maxy);
  1173.         c = randnum(maxx);
  1174.         d = randnum(maxy);
  1175.         drwline(SET,colr,a,b,c,d);
  1176.         colr += 3;
  1177.         if (colr > 255)
  1178.             colr = 16;
  1179.     }
  1180.     drwstring(SET,7,0,buf2,x1+spcing,y1+spcing);
  1181.     drwstringlt(SET,7,0,buf2,x1+spcing,y1+spcing);
  1182.     drwstringrt(SET,7,0,buf2,x1+spcing,y1+spcing);
  1183.     drwstringdn(SET,7,0,buf2,x1+spcing,y1+spcing);
  1184.  
  1185.     for(i=0;i<num;i++)
  1186.         scrolldn(x1,y1,x2,y2,skip,0);
  1187.  
  1188.     ret = demogetkey();
  1189.     if ((ret=='s') || (ret=='q'))
  1190.         return(ret);
  1191.  
  1192.     /*
  1193.      * Show scrollrt
  1194.      */
  1195.     setview(0,16,maxx,maxy);
  1196.     sprintf(buf,"scrollrt(x1,y1,x2,y2,numlines,fillcolor);");
  1197.     drwstring(SET,7,0,buf,10,16);
  1198.     setview(x1,y1,x2,y2);
  1199.     fillview(0);
  1200.     totnum = maxx / 10;
  1201.     for(i=0;i<totnum;i++) {
  1202.         a = randnum(maxx);
  1203.         b = randnum(maxy);
  1204.         c = randnum(maxx);
  1205.         d = randnum(maxy);
  1206.         drwline(SET,colr,a,b,c,d);
  1207.         colr += 3;
  1208.         if (colr > 255)
  1209.             colr = 16;
  1210.     }
  1211.     drwstring(SET,7,0,buf2,x1+spcing,y1+spcing);
  1212.     drwstringlt(SET,7,0,buf2,x1+spcing,y1+spcing);
  1213.     drwstringrt(SET,7,0,buf2,x1+spcing,y1+spcing);
  1214.     drwstringdn(SET,7,0,buf2,x1+spcing,y1+spcing);
  1215.  
  1216.     for(i=0;i<num;i++)
  1217.         scrollrt(x1,y1,x2,y2,skip,0);
  1218.  
  1219.     ret = demogetkey();
  1220.     if ((ret=='s') || (ret=='q'))
  1221.         return(ret);
  1222.  
  1223.     /*
  1224.      * Show paging
  1225.      */
  1226.      setview(0,0,maxx,maxy);
  1227.  
  1228.     /*
  1229.      * check to see if card supports changing the diplay offset
  1230.      */
  1231.  
  1232.     if (pagedisplay(0,0,0) == 0) {
  1233.         fillscreen(0);
  1234.         drwstring(SET,7,0,title,10,0);
  1235.         sprintf(buf,"Sorry, This video card does not support");
  1236.         drwstring(SET,7,0,buf,10,16);
  1237.         sprintf(buf,"changing the display offset in this");
  1238.         drwstring(SET,7,0,buf,10,32);
  1239.         sprintf(buf,"video mode. Unable to do the paging demo.");
  1240.         drwstring(SET,7,0,buf,10,48);
  1241.         sprintf(buf,"Press a key...");
  1242.         drwstring(SET,7,0,buf,10,64);
  1243.         ret = demogetkey();
  1244.         fillscreen(0);
  1245.         return(ret);
  1246.      }
  1247.  
  1248.     /*
  1249.      * check to see if there is enough memory for multiple pages
  1250.      */
  1251.  
  1252.     numbanks = (long)(maxx + 1) * (long)(maxy + 1);
  1253.     banksperpage = numbanks / (long)65536;
  1254.     if(numbanks % 65536l)
  1255.         banksperpage++; /* round up if there is extra */
  1256.     numbanks = (long)whichmem() / (long)64;
  1257.     numpages = (numbanks / banksperpage) - 1;
  1258.  
  1259.     /*
  1260.      * limit total number of pages to 3 (0-2) for this demo
  1261.      */
  1262.  
  1263.     if (numpages >= 3)
  1264.         numpages = 2;
  1265.  
  1266.     if (numpages == 0) {
  1267.         fillscreen(0);
  1268.         drwstring(SET,7,0,title,10,0);
  1269.         sprintf(buf,"Sorry, this video card does not have enough video memory to");
  1270.         drwstring(SET,7,0,buf,10,16);
  1271.         sprintf(buf,"support multiple video pages in this video mode.");
  1272.         drwstring(SET,7,0,buf,10,32);
  1273.         sprintf(buf,"Press a key...");
  1274.         drwstring(SET,7,0,buf,10,48);
  1275.         ret = demogetkey();
  1276.         fillscreen(0);
  1277.         return(ret);
  1278.      }
  1279.  
  1280.  
  1281.     totnum = maxx / 6;
  1282.     fillscreen(0);
  1283.     for(i=0;i<=numpages;i++) {
  1284.         setview(0,0,maxx,maxy);
  1285.         pageactive(i);
  1286.         pagedisplay(0,0,i);
  1287.         fillpage(0);
  1288.         drwstring(SET,7,0,title,10,0);
  1289.         sprintf(buf,"pageactive(page)");
  1290.         drwstring(SET,7,0,buf,10,16);
  1291.         sprintf(buf,"pagedisplay(startx,starty,page)");
  1292.         drwstring(SET,7,0,buf,10,32);
  1293.         sprintf(buf,"This Is Page %d",i);
  1294.         for(j=0;j<20;j++)
  1295.             drwstring(SET,12+i,0,buf,10,50+j*16);
  1296.         setview(150,58,maxx-10,maxy-10);
  1297.         for(j=0;j<totnum;j++) {
  1298.             x1 = randnum(maxx);
  1299.             y1 = randnum(maxy);
  1300.             x2 = randnum(100);
  1301.             y2 = randnum(100);
  1302.             colr += 1;
  1303.             if (colr > 16)
  1304.                 colr = 1;
  1305.             switch (i) {
  1306.                 case 0:
  1307.                     drwfillcircle(SET,colr,x1,y1,x2);
  1308.                     break;
  1309.                 case 1:
  1310.                     drwline(SET,colr,x1,y1,x1+x2,y1+y2);
  1311.                     drwellipse(SET,colr,x1,y1,x2/4,y2/4);
  1312.                     break;
  1313.                 case 2:
  1314.                     drwfillbox(SET,colr,x1,y1,x1+x2,y1+y2);
  1315.                     break;
  1316.             }
  1317.         }
  1318.         drwbox(SET,15,150,58,maxx-10,maxy-10);
  1319.         sdelay(35);
  1320.     }
  1321.     pageactive(0);
  1322.     pagedisplay(0,0,0);
  1323.     ret = demogetkey();
  1324.     if ((ret=='s') || (ret=='q'))
  1325.         return(ret);
  1326.  
  1327.     for(j=0;j<2;j++) {
  1328.         for(i=0;i<=numpages;i++) {
  1329.             pagedisplay(0,0,i);
  1330.             sdelay(35);
  1331.         }
  1332.     }
  1333.     for(j=0;j<20;j++) {
  1334.         for(i=0;i<=numpages;i++) {
  1335.             pagedisplay(0,0,i);
  1336.             sdelay(1);
  1337.         }
  1338.     }
  1339.     pagedisplay(0,0,0);
  1340.     setview(0,0,maxx,maxy);
  1341.     ret = demogetkey();
  1342.     return(ret);
  1343.  
  1344. }
  1345.  
  1346.  
  1347. /**********
  1348.  * DOTEXT *
  1349.  **********/
  1350.  
  1351. char dotext(void)
  1352. {
  1353.     int i, colr;
  1354.     char ret;
  1355.     char title[TITLEN];
  1356.     char buf[TITLEN];
  1357.     char buf2[TITLEN];
  1358.  
  1359.     /*
  1360.      * Set up the Title
  1361.      */
  1362.     sprintf(title,"DEMO 6: Text functions");
  1363.     palset(pal,0,255);
  1364.  
  1365.     /*
  1366.      * Show alternate print directions
  1367.      */
  1368.     fillscreen(0);
  1369.     setview(0,0,maxx,maxy);
  1370.     drwstring(SET,7,0,title,10,0);
  1371.     sprintf(buf,"drwstring(mode,foregnd,bkgnd,string,x,y);");
  1372.     drwstring(SET,7,0,buf,10,16);
  1373.     setview(0,32,maxx,maxy);
  1374.     sprintf(buf2,"The Quick Brown Fox Jumped Over The Lazy Dog's Back! 0123456789");
  1375.     colr = 16;
  1376.     for(i=32;i<=maxy;i+=20) {
  1377.         drwstring(SET,colr,0,buf2,0,i);
  1378.         colr+=5;
  1379.         if (colr>255)
  1380.             colr = 16;
  1381.     }
  1382.     ret = demogetkey();
  1383.     if ((ret=='s') || (ret=='q')) {
  1384.         setview(0,0,maxx,maxy);
  1385.         fillscreen(0);
  1386.         return(ret);
  1387.     }
  1388.  
  1389.     fillview(0);
  1390.     setview(0,16,maxx,32);
  1391.     sprintf(buf,"drwstringlt(mode,foregnd,bkgnd,string,x,y);");
  1392.     drwstring(SET,7,0,buf,10,16);
  1393.     setview(0,32,maxx,maxy);
  1394.     colr = 16;
  1395.     for(i=0;i<=maxx;i+=20) {
  1396.         drwstringlt(SET,colr,0,buf2,i,maxy);
  1397.         colr+=5;
  1398.         if (colr>255)
  1399.             colr = 16;
  1400.     }
  1401.     ret = demogetkey();
  1402.     if ((ret=='s') || (ret=='q')) {
  1403.         setview(0,0,maxx,maxy);
  1404.         fillscreen(0);
  1405.         return(ret);
  1406.     }
  1407.  
  1408.     fillview(0);
  1409.     setview(0,16,maxx,32);
  1410.     sprintf(buf,"drwstringdn(mode,foregnd,bkgnd,string,x,y);");
  1411.     drwstring(SET,7,0,buf,10,16);
  1412.     setview(0,32,maxx,maxy);
  1413.     colr = 16;
  1414.     for(i=maxy;i>=32;i-=20) {
  1415.         drwstringdn(SET,colr,0,buf2,maxx,i);
  1416.         colr+=5;
  1417.         if (colr>255)
  1418.             colr = 16;
  1419.     }
  1420.     ret = demogetkey();
  1421.     if ((ret=='s') || (ret=='q')) {
  1422.         setview(0,0,maxx,maxy);
  1423.         fillscreen(0);
  1424.         return(ret);
  1425.     }
  1426.  
  1427.     fillview(0);
  1428.     setview(0,16,maxx,32);
  1429.     sprintf(buf,"drwstringrt(mode,foregnd,bkgnd,string,x,y);");
  1430.     drwstring(SET,7,0,buf,10,16);
  1431.     setview(0,32,maxx,maxy);
  1432.     colr = 16;
  1433.     for(i=maxx;i>=0;i-=20) {
  1434.         drwstringrt(SET,colr,0,buf2,i,32);
  1435.         colr+=5;
  1436.         if (colr>255)
  1437.             colr = 16;
  1438.     }
  1439.     ret = demogetkey();
  1440.     setview(0,0,maxx,maxy);
  1441.     fillscreen(0);
  1442.  
  1443.     return(ret);
  1444.  
  1445. }
  1446.